package com.game.autoTool.project.web.operate;

import com.alibaba.fastjson.JSONArray;
import com.benjaminwan.ocrlibrary.OcrResult;
import com.benjaminwan.ocrlibrary.Point;
import com.benjaminwan.ocrlibrary.TextBlock;
import com.game.autoTool.project.web.domain.dto.OcrResultDto;
import io.github.mymonstercat.Model;
import io.github.mymonstercat.ocr.InferenceEngine;

import java.util.ArrayList;
import java.util.List;

/**
 * 截图识别工具类
 */
public class ScreenshotOcrUtil {

    public static void main(String[] args) {
        List<OcrResultDto> resultDtoList = coordinateImgParser("E:\\bjdl\\autoTool\\src\\main\\resources\\imageTemplate\\活动.jpg", 1, 100);

        System.out.println(resultDtoList);
    }


    /**
     * 识别图片,返回所有信息的坐标位置
     * 关闭按钮也可以识别出来
     *
     * @param imagePath 图片的绝对路径
     * @param type      识别类型 1居中(点击按钮),2居中向上(人物)
     * @param type      偏移量 向上偏移 X 个单位，可根据实际情况调整
     * @return 包含识别文字信息和坐标位置的字符串
     */
    public static List<OcrResultDto> coordinateImgParser(String imagePath, int type, int offset) {

        try {
            // 初始化推理引擎
            InferenceEngine engine = InferenceEngine.getInstance(Model.ONNX_PPOCR_V4);

            // 运行 OCR 并获取结果
            OcrResult ocrResult = engine.runOcr(imagePath);
//            System.out.println("识别结果为" + ocrResult);

            ArrayList<TextBlock> textBlocks = ocrResult.getTextBlocks();
            //这是一个由 Point 对象构成的列表，用于表示识别出的文本区域的边界框的四个顶点坐标。通常按照左上、右上、右下、左下的顺序排列
            //TextBlock{boxPoint=[Point{x=1462, y=713}, Point{x=1553, y=713}, Point{x=1553, y=742}, Point{x=1462, y=742}], boxScore=0.7800038, angleIndex=-1, angleScore=0.0, angleTime=0.0, text='三界妖王', charScores=[0.99961084, 0.99998367, 0.9997358, 0.9965372], crnnTime=31.325699985027313, blockTime=31.325699985027313}
            List<OcrResultDto> resultDtoList = new ArrayList<>();
            for (TextBlock textBlock : textBlocks) {
                String text = textBlock.getText();
                ArrayList<Point> boxPoint = textBlock.getBoxPoint();
                Point topLeft = boxPoint.get(0);
                Point topRight = boxPoint.get(1);
                Point bottomRight = boxPoint.get(2);
                Point bottomLeft = boxPoint.get(3);

                //处理识别结果
                OcrResultDto resultDto = calculateCenter(topLeft, topRight, bottomRight, bottomLeft, text);

                // 根据 type 进行坐标调整
                if (type == 2) {
                    int centerY = Integer.parseInt(resultDto.getEndTargetY());
                    // 这里简单假设向上偏移 X 个单位，可根据实际情况调整
                    centerY -= offset;
                    resultDto.setEndTargetY(String.valueOf(centerY));
                }

                resultDtoList.add(resultDto);
            }

            return resultDtoList;

        } catch (Exception e) {
            System.out.println("识别结果出问题!");
            e.printStackTrace();
        }

        return null;
    }


    /**
     * 根据四个角的坐标计算居中位置，并将结果封装到 OcrResultDto 对象中
     *
     * @param topLeft     左上角坐标
     * @param topRight    右上角坐标
     * @param bottomRight 右下角坐标
     * @param bottomLeft  左下角坐标
     * @param text        识别出的文本
     * @return 包含识别结果和居中位置坐标的 OcrResultDto 对象
     */
    public static OcrResultDto calculateCenter(Point topLeft, Point topRight, Point bottomRight, Point bottomLeft, String text) {
        // 计算四个角的 x 坐标总和
        int totalX = topLeft.getX() + topRight.getX() + bottomRight.getX() + bottomLeft.getX();
        // 计算四个角的 y 坐标总和
        int totalY = topLeft.getY() + topRight.getY() + bottomRight.getY() + bottomLeft.getY();

        // 计算居中位置的 x 坐标
        int centerX = totalX / 4;
        // 计算居中位置的 y 坐标
        int centerY = totalY / 4;

        // 创建 OcrResultDto 对象
        OcrResultDto resultDto = new OcrResultDto();
        // 设置识别结果
        resultDto.setText(text);
        // 设置居中位置的 x 坐标
        resultDto.setStartTargetX(String.valueOf(centerX));
        // 设置居中位置的 y 坐标
        resultDto.setEndTargetY(String.valueOf(centerY));

        return resultDto;
    }


}
